package org.leon.plugin;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Connection;
import java.util.Properties;

@Intercepts({// 这里时大括号，表面可以声明多个 Signature
        @Signature(
                type= StatementHandler.class,   // 指定拦截那个组件
                method = "prepare",             // 指定拦截组件的方法
                args = {Connection.class, Integer.class}  // 拦截方法的入参，防止引方法重载引起问题
        )
})
public class MyPlugin implements Interceptor {

    /**
     * 每次操作都会在这里被拦截
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 增强逻辑
        System.out.println("...");
        return invocation.proceed();
    }

    /**
     * 主要把这个拦截器生成一个代理放到拦截器链中
     * @param target 要拦截的对象
     * @return 代理对象
     */
    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    /**
     * 获取配置文件中配置的参数，插件初始化时调用一次
     */
    @Override
    public void setProperties(Properties properties) {
        System.out.println(properties);
    }
}
